package com.mjf.io.input;

import org.junit.Test;

import java.io.FileInputStream;
import java.io.IOException;

/**
 * FileInputStream:字节输入流(用来操作二进制文件,比如图片、视频、音频、doc、pdf等)
 */
public class FileInputStreamUse {

    /**
     * 单字节读取，效率较低
     */
    @Test
    public void readFile01() {
        String filePath = "D:\\coding\\idea\\java-stu\\input\\hello.txt";
        FileInputStream fis = null;
        int readData;   // 读取到的字节数据

        try {
            // 用于读取文件
            fis = new FileInputStream(filePath);
            // 从输入流读取一个字节的数据。如果返回-1表示文件读取完毕
            // 如果文件中有中文的话，每次读取一个字节会出现乱码(utf-8 英文占一个字节，中文占三个字节)
            while ((readData = fis.read()) != -1) {
                System.out.print((char) readData); // 转成 char 类型显示
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 多字节读取
     */
    @Test
    public void readFile02() {
        String filePath = "D:\\coding\\idea\\java-stu\\input\\hello.txt";
        FileInputStream fis = null;
        byte[] buf = new byte[8];
        int readLen;   // 读取到的字节个数

        try {
            fis = new FileInputStream(filePath);
            // 从输入流读取指定字节（buf.length）的数据。如果返回-1表示文件读取完毕
            // 如果文件中有中文的话，也会出现乱码(utf-8 英文占一个字节，中文占三个字节)
            while ((readLen = fis.read(buf)) != -1) {
                System.out.print(new String(buf, 0, readLen)); // 读取到的数据存储到了 buf 中
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}
